package com.zhoutian.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.zhoutian.constant.MessageConstant;
import com.zhoutian.dao.MemberDao;
import com.zhoutian.dao.OrderDao;
import com.zhoutian.dao.OrderManageDao;
import com.zhoutian.dao.OrderSettingDao;
import com.zhoutian.entity.PageResult;
import com.zhoutian.entity.QueryPageBean;
import com.zhoutian.entity.Result;
import com.zhoutian.pojo.*;
import com.zhoutian.service.OrderManageService;
import com.zhoutian.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@Service(interfaceClass = OrderManageService.class)
@Transactional
public class OrderManageServiceImpl implements OrderManageService {

    @Autowired
    private OrderManageDao orderManageDao;
    @Autowired
    private OrderSettingDao orderSettingDao;
    @Autowired
    private MemberDao memberDao;
    @Autowired
    private OrderDao orderDao;

    //分页查询
    public PageResult findPage(QueryPageBean pageBean) {
        Integer currentPage = pageBean.getCurrentPage();
        Integer pageSize = pageBean.getPageSize();
        String queryString = pageBean.getQueryString();
        //使用分页助手插件实现分页查询
        PageHelper.startPage(currentPage, pageSize);
        Page<OrderManage> page = orderManageDao.findOrderManage(queryString);
        return new PageResult(page.getTotal(), page.getResult());
    }

    //根据id删除预约信息
    public void delete(Integer id) {
        orderManageDao.deleteById(id);
    }

    //根据id取消预约信息
    public void cancel(Integer id) {
        orderManageDao.cancelById(id);
    }

    //查询全部套餐信息
    public List<Setmeal> findAllSetmeals() {
        return orderManageDao.findAllSetmeals();
    }

    //添加预约信息
    public Result add(OrderManage om, Integer setmealId) throws Exception {
        /**
         1、检查当前用户是否为会员，如果是会员则直接完成预约，如果不是会员提示健康管理师手机号是否有误
         2、检查用户所选择的预约日期是否已经提前进行了预约设置，如果没有设置则无法进行预约
         3、检查用户所选择的预约日期是否已经约满，如果已经约满则无法预约
         4、检查用户是否重复预约（同一个用户在同一天预约了同一个套餐），如果是重复预约则无法完成再次预约
         5、预约成功，更新当日的已预约人数
         */
        String pn= om.getPhoneNumber();
        Integer a = Integer.valueOf(orderManageDao.findMemberByPhoneNumber(pn));
        //判断手机号是否注册
        if (a > 0) {
            //获取日期
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            String format = simpleDateFormat.format(om.getOrderDate());
            Date date = DateUtils.parseString2Date(format);
            OrderSetting orderSetting = orderSettingDao.findByOrderDate(date);
            if(orderSetting == null){
                //所选日期没有提前进行预约设置，不能完成预约
                return new Result(false, MessageConstant.SELECTED_DATE_CANNOT_ORDER);//所选日期不能进行体检预约
            }

            if(orderSetting.getReservations() >= orderSetting.getNumber()){
                //所选日期已经约满，无法预约
                return new Result(false, MessageConstant.ORDER_FULL);//预约已满
            }

            //判断是否在重复预约
            String telephone = om.getPhoneNumber();
            Member member = memberDao.findByTelephone(telephone);
            if(member != null){
                Integer memberId = member.getId();//会员id
                Order order = new Order(memberId,date,setmealId);
                List<Order> orderList = orderDao.findByCondition(order);
                if(orderList != null && orderList.size() > 0){
                    //用户在重复预约，不能完成预约
                    return new Result(false,MessageConstant.HAS_ORDERED);//已经完成预约，不能重复预约
                }
            }

            //保存预约信息
            Order order = new Order(member.getId(),
                    date,//设置时间
                    ("健康管理师"),//设置预约方式
                    "未到诊",
                    setmealId);//设置ID
            orderDao.add(order);

            //更新已预约人数
            orderSetting.setReservations(orderSetting.getReservations() + 1);
            orderSettingDao.editReservationsByOrderDate(orderSetting);
            return new Result(true,MessageConstant.ORDER_SUCCESS,order.getId());//预约成功

        } else {
            return new Result(false,MessageConstant.ORDER_PHONE_FULL);//手机号未注册，请检查手机号是否输入有误
        }

    }


}
